package com.qf.shiro;

import com.qf.dao.MenuMapper;
import com.qf.dao.PermsettingMapper;
import com.qf.pojo.Menu;
import com.qf.pojo.Permsetting;
import com.qf.pojo.Usermanager;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;

/**
 * 2019/11/26 0026
 * Author->DT
 * qmxc
 * 行到水穷处 坐看云起时
 * 模块：重新定义FormAuthenticationFilter过滤器，
 * 使用Shiro登录时在成功页面获得登录人信息
 */
@Component
public class ShiroFilterForm extends FormAuthenticationFilter {
    @Autowired
    private PermsettingMapper roleMapper;
    @Autowired
    private MenuMapper menuMapper;

    //重写onLoginSuccess方法，把页面需要的用户信息(用户+菜单权限信息)保存到session中
    @Override
    protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request, ServletResponse response) throws Exception {
        System.out.println("执行onLoginSuccess");
        //1.获取已登录的用户信息
        Usermanager user = (Usermanager) subject.getPrincipal();
        //2.查询该用户对应的信息，并设置到user对象中:

        //2.1根据用户角色id 查询出对应的用户角色信息
        Permsetting role = roleMapper.selectByPrimaryKey(user.getUserrole());
        //2.根据角色查询出对应的菜单列表；
        List<Menu> menuList= menuMapper.selectByPrimaryKey(role.getId());

        //新建存取一级菜单的列表
        ArrayList<Menu> firstList = new ArrayList<>();
        //遍历查询出来的菜单列表
        for (Menu menu : menuList) {
            //判断menu是否为一级菜单
            if (menu.getParentId()==0){
                //当前菜单为一级菜单
                //创建二级菜单列表
                ArrayList<Menu> secondList = new ArrayList<>();
                //第二次遍历菜单列表，用来查询出对应一级菜单的二级菜单；
                for (Menu menu2 : menuList) {
                    //判断是否为当前一级菜单对应的二级菜单：
                    if (menu.getMid()==menu2.getParentId()){
                        //当前菜单为当前一级菜单对应的二级菜单
                        //加入到secondList中
                        secondList.add(menu2);
                    }
                }
                //遍历查询当前菜单的二级菜单结束，将查询到的二级菜单赋值到到当前菜单中；
                menu.setSecondMenu(secondList);
                firstList.add(menu);
            }



        }
        //全部遍历结束，菜单列表中的每个菜单的一级列表对应的二级列表均已设置
        //将结果设置到角色对象中
        role.setMenuList(firstList);
        //将该角色对象设置到用户对象中：
        user.setRole(role);
        //将该对象设置到session域中
        HttpServletRequest req= (HttpServletRequest) request;
        req.getSession().setAttribute("user", user);
        System.out.println("执行onLoginSuccess结束");
        //重定向到首页
        HttpServletResponse resp= (HttpServletResponse) response;
        resp.sendRedirect("/index.jsp");
        return false;
//        return super.onLoginSuccess(token, subject, request, response);
    }
}
